# @Time : 2020/8/26 17:52
# @Author : Fioman 
# @Phone : 13149920693
import cv2 as cv
import numpy as np

# 减少图像色彩.使用双边滤波速度慢一点,但是可以使用多次滤波,应用小双边滤波器.
numDown = 2 # 缩减像素采样的数目
numBilateral = 20 # 定义双边滤波的数目
imgOriginal = cv.imread("love.png")
cv.imshow("Original",imgOriginal)
print(imgOriginal.shape)
cv.waitKey(0)
imgColor = imgOriginal
for _ in range(numDown):
    imgColor = cv.pyrDown(imgColor)

# 重复使用小的双边滤波代替一个大的滤波
for _ in range(numBilateral):
    imgColor = cv.bilateralFilter(imgColor,d=50,sigmaColor=50,sigmaSpace=50)

# 升采样图片到原始大小
for _ in range(numDown):
    imgColor = cv.pyrUp(imgColor)
print(imgColor.shape)
# 转换为灰度,并使用中值滤波器减少噪点
imgGray = cv.cvtColor(imgOriginal,cv.COLOR_BGR2GRAY)
imgBlur = cv.medianBlur(imgGray,7)

# 创建轮廓
imgEdge = cv.adaptiveThreshold(imgBlur,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,blockSize=9,C=2)

# 合并轮廓和彩色图片
# 最后一步就是处理彩色图像imgColor 与边缘掩码(imgEdge)组合.
imgEdge = cv.cvtColor(imgEdge,cv.COLOR_GRAY2BGR)
imgCartoon = cv.bitwise_and(imgColor,imgEdge)
cv.imshow("Cartoon",imgCartoon)
cv.waitKey(0)

